package com.nf.sms.dao.impl;

import com.nf.sms.dao.UserDao;
import com.nf.sms.entity.User;
import com.nf.sms.utils.DbUtil;

import java.sql.*;

/**
 * DAO接口的实现
 * 注意：根据实际需要，可以给接口定义多个实现
 * 如果一个接口只有一个实现，则一般不需要接口，而直接定义类就好了
 *
 * 注意：实现接口时，必须重写接口的所有抽象方法 - 实现方法
 *
 *
 * @author ZQX
 * @date 2024-10-10
 */
public class UserDaoImpl implements UserDao {

    @Override
    public int insert(User user) {
        return 0;
    }

    /**
     * select * from users where username='admin'
     *
     * @param username 帐号
     * @return
     */
    @Override
    public User selectByName(String username) {

        User user = null ;

        // 第一：定义要操作数据库的 SQL 语句，参数使用 ? 占位符代替
        String sql = "select * from users where username=?";

        // 第二：获取连接对象
        Connection conn = DbUtil.getConnection();
        PreparedStatement psmt = null ;
        ResultSet rst = null ;

        try {
            // 第三：预编译 SQL 语句 - 获取语句对象
            psmt = conn.prepareStatement(sql);

            // 第四：给占位符填充数据 - 注：Xxx代表是数据类型
            // 语句对象.setXxx(参数索引,值)
            psmt.setString(1,username) ;

            // 第五：执行 SQL 语句 - executeUpdate()、executeQuery()
            // 语法一：int 变量 = 语句对象.executeUpdate()
            // 语法二：ResultSet 变量 = 语句对象.executeQuery()
            rst = psmt.executeQuery();

            // 第六：对结果进行处理 - 把结果集中的数据读取出来，并存储到实体对象中
            // 结果集对象.next() ： 判断是否存在下一条数据
            // 语法一：结果集对象.getXxx(查询字段的下标索引) : 获取某个字段的数据
            // 语法二：结果集对象.getXxx(查询字段的名称) : 获取某个字段的数据
            // 1.判断是否存在查询数据
            if(rst.next()) {
                // 2.读取当前行的各列数据
                int id = rst.getInt(1);
                // String username = rst.getString(2);
                String password = rst.getString(3);
                String level = rst.getString(4);
                String image = rst.getString(5);
                String phone = rst.getString(6);
                String email = rst.getString(7);
                Date registerTime = rst.getDate(8);
                int status = rst.getInt(9);

                // 3.实例化实体对象
                // User user = new User() ;

                // 4.初始化对象 - 实现数据的封装
                // user.setId(id);
                // ...

               user = new
                        User(id, username,
                        password, level, image,
                        phone, email, registerTime, status) ;
            }

        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 第七：关闭对象
            DbUtil.close(rst,psmt,conn);
        }

        return user;
    }

    @Override
    public int updatePassword(String username, String newPass) {
        return 0;
    }
}
